home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / ip / dialupip / dialupip2.0 / doc / usenix.paper.ms < prev    next >
Encoding:
Text File  |  1991-01-14  |  23.3 KB  |  515 lines

  1. \" $Header: usenix.paper.ms,v 2.0 91/01/11 17:12:08 rsalz Exp $
  2. .nr PO 1.25i
  3. .FM 1i
  4. .HM 1i
  5. .DS C
  6. .ps 14
  7. .vs 16.8
  8. \fBImplementation of Dial-up IP for UNIX Systems\**\fP
  9. .DE
  10. .FS
  11. UNIX is a registered trademark of AT&T.
  12. .FE
  13. .DS C
  14. .ps 11
  15. .vs 13.2
  16. .ft I
  17. Leo Lanzillo
  18. .ft R
  19. CSNET Coordination and Information Center\**
  20. BBN Systems and Technologies Corporation
  21. Cambridge, MA 02238
  22. 617-873-2777
  23. leo@sh.cs.net
  24. .sp
  25. .ft I
  26. Craig Partridge
  27. .ft R
  28. BBN Systems and Technologies Corporation
  29. Cambridge, MA 02238
  30. 617-873-2777
  31. craig@nnsc.nsf.net
  32. .DE
  33. .LP
  34. .FS
  35. CSNET is operated by BBN Systems and Technologies Corporation under
  36. a subcontract with the University Corporation for Atmospheric Research,
  37. which operates under contract with the U.S. National Science Foundation.
  38. Any opinions, findings, conclusions or recommendations expressed in this
  39. paper are those of the authors and do not necessarily reflect the views
  40. of BBN, UCAR, or the NSF.
  41. .FE
  42. .fi
  43. .ad
  44. .ce 1
  45. \fBAbstract\fP
  46. .sp 0.5
  47. .in +0.75i
  48. .ll -0.75i
  49. .ps -1.5
  50. .vs -1.8
  51. CSNET has developed a driver to support the sending of Internet
  52. Protocol (IP) datagrams
  53. over dial-up phone lines. This driver can automatically establish and
  54. disconnect phone calls as IP traffic dictates. This code works in
  55. binary-only BSD systems.
  56. .br
  57. .ll +0.75i
  58. .in -0.75i
  59. .NH 1 
  60. Introduction and Motivation
  61. .PP
  62. As the proliferation of computers, workstations, and local area
  63. networks continues, the demand for an inexpensive, simple, and reliable
  64. method of connecting computers and networks also grows.  One
  65. of the least expensive methods of connecting computers is to use dial-up
  66. phone lines.
  67. This approach results in a true pay-for-usage fee service,
  68. but until now the use of dial-up phone lines has been restricted to
  69. application-specific protocols, instead of more
  70. general networking protocols that could be used by multiple applications.
  71. .PP
  72. Dial-up IP is a solution to this problem. Because of its dial-up nature,
  73. its cost is directly related to usage. It requires only modems and
  74. serial interfaces, and, most important, it provides Internet Protocol
  75. (IP) connectivity between the two endpoints. IP connectivity allows the
  76. host administrators to link computers together using any Internet protocol,
  77. including TCP and UDP, and at higher levels, FTP, TELNET, \fIrcp\fP,
  78. \fIrlogin\fP, and NFS.\**
  79. .FS
  80. Don't try this at home.
  81. Currently, commercial NFS systems do not run well
  82. through gateways or over slow links, however
  83. an experimental version of NFS that has been enhanced with Jacobson's
  84. algorithms has been shown to work quite well over complex internets.
  85. .FE
  86. In addition, the system's use of dial-up
  87. links allows for the on-demand joining of different networks by connecting
  88. IP gateways to form an internetwork of computers.
  89. .NH 2
  90. A New CSNET Service
  91. .PP
  92. We view dial-up IP as an enhanced replacement for CSNET's PhoneNet service.
  93. CSNET is a logical network, a metanetwork, which, in addition to
  94. information and consulting services,
  95. offers two distinct types of communication services.
  96. The ``top-of-the-line'' service is full-time IP connectivity with the
  97. Internet through the DARPA-approved gateway, \fIrelay.cs.net\fP.
  98. Connectivity can be provided via X.25 over a public data network [#6], via
  99. Cypress [#4],
  100. or via a leased data line to the CSNET CIC. The monthly costs of such
  101. arrangements are sufficiently high that they are usually
  102. of interest only to high-volume users (i.e., users requiring over
  103. two to four hours of connectivity per day).
  104. .PP
  105. The other CSNET communication service is PhoneNet, which provides
  106. electronic mail connectivity to
  107. over one hundred universities and research centers.
  108. PhoneNet is a star-shaped, store-and-forward mail network
  109. that uses dial-up phone lines and modems to transfer mail between
  110. remote sites and \fIrelay.cs.net\fP. \fIRelay\fP acts as a gateway
  111. to the Internet and to other PhoneNet sites. These sites periodically call or
  112. are called to deliver mail. The average delivery time via PhoneNet
  113. ranges from one hour to one day.
  114. .PP
  115. PhoneNet is limited in that it is used only for mail. Many of the
  116. CSNET clients have asked for access to the wider range of Internet services
  117. available via TCP/IP, in particular, anonymous FTP.
  118. There have also been occasional complaints about the limited error recovery
  119. ability of the PhoneNet protocol.
  120. .PP
  121. Dial-up IP is an intermediate offering that
  122. combines the positive aspects of CSNET's other services:
  123. the robustness and reliability of full-time IP, the efficiency
  124. and cost management aspects of PhoneNet, and ready availability.
  125. Dial-up IP is also
  126. more secure than a full-time IP connection, both because
  127. there are a number of security checks that must be passed before
  128. a connection is established and because the line is only up for
  129. limited periods of time.
  130. .NH 2
  131. Design Goals
  132. .PP
  133. We had three major design goals.  Dial-up IP had to be easy
  134. to install, transparent to users, cost-effective and moderately secure.
  135. .PP
  136. Dial-up IP had to be easy to install and to configure.
  137. Inexperienced system administrators needed to be able to
  138. install software quickly and to not have to worry about it. For these
  139. reasons we designed dial-up IP to fit cleanly into the UNIX kernel,
  140. requiring modifications only to configuration files and a couple of
  141. include files.
  142. .PP
  143. Given the diversity of the CSNET community, and the fact that many
  144. sites are universities with high-turnover student help,
  145. we had to design dial-up IP to be simple to use, or better yet,
  146. transparent to the users.  Other dial-up systems require user
  147. intervention to establish a phone link. We wanted to develop a
  148. version of dial-up IP
  149. which makes the connection establishment transparent to the user.
  150. This approach has a further advantage of saving the user from having
  151. to know which network a particular
  152. host is on. Dial-up hosts, or hosts on LANs accessible only through
  153. dial-up gateways, appear as accessible as hosts on
  154. permanently-connected networks.
  155. .PP
  156. Furthermore, we wanted dial-up IP to be cost-effective. We wanted it
  157. to use the line resources efficiently by filling the line bandwidth
  158. when a phone line was active and minimizing phone charges by
  159. terminating phone lines quickly when they were no longer in use.
  160. .PP
  161. Finally, we wanted dial-up IP to be moderately secure.  In particular,
  162. we wanted sites to be able to control when dial-up links were established
  163. and who was able to establish them.
  164. .PP
  165. We believe we have achieved these goals.
  166. .NH 1
  167. A Datagram's Journey Through Dial-up IP
  168. .PP
  169. To illustrate how dial-up IP works, a brief and slightly
  170. simplified description of an example dial-up IP interaction follows.
  171. .PP
  172. Imagine that \fIbig-college.edu\fP has a dial-up IP link to
  173. \fIrelay.cs.net\fP, and that a user on \fIbig-college.edu\fP wishes
  174. to FTP a file from some other Internet site.
  175. .PP
  176. When \fIftp\fP is invoked by the user, it calls on TCP to establish a
  177. connection to the other site.
  178. TCP, in turn, calls upon IP
  179. to send a TCP SYN datagram (a synchronizing segment used to open
  180. connections) to the remote site.
  181. .PP
  182. When IP receives a datagram it consults its routing tables to find
  183. out which network interface to send the datagram out on. In this example,
  184. the routing tables point to a dial-up IP interface, \fIdu0\fP.
  185. The IP layer then queues the datagram on the outbound queue of
  186. \fIdu0\fP.
  187. .PP
  188. When a datagram arrives on \fIdu0\fP's queue, the dial-up interface code
  189. checks to see if a phone call is currently in progress to
  190. \fIrelay.cs.net\fP. If a call is in progress, the datagram
  191. is sent over the line. However, if a call is not currently in progress,
  192. the dial-up interface must find a way to dial the phone.
  193. .PP
  194. Unfortunately, the interface layer of the kernel is not the best place
  195. to insert code to dial a modem. Dialing a modem takes several seconds
  196. and the interface code in the kernel is running at a high interrupt
  197. level. To get around this problem, we created a pseudo-device,
  198. \fI/dev/dial-up\fP, for requests to dial the phone. \fI/dev/dial-up\fP
  199. maintains a queue of requests for modems to be dialed. \fIDu0\fP
  200. requests a phone call by writing a request structure into the queue.
  201. A daemon, \fIdiald\fP, reads the requests from the queue, finds an
  202. available modem, dials the remote host, and then logs into a special
  203. account. (Note that we use standard UNIX \fIlogin\fP; the account
  204. is special because it has a login shell that brings up dial-up IP).
  205. Once the login is completed, the SLIP protocol [#5] is activated on the line.
  206. At this point, the local dial-up interface is notified that it can start
  207. passing datagrams over the connection.
  208. .PP
  209. On the remote end, when the datagram is received from the dial-up line,
  210. it is passed up to the IP layer, like a datagram from any other interface.
  211. .PP
  212. After the phone call is established, the dial-up IP driver watches
  213. the line. If the line is idle for too long (a few minutes) the driver
  214. initiates a hangup.
  215. .NH 1
  216. Details of the Kernel Implementation
  217. .NH 2
  218. The Dial-up Interface
  219. .PP
  220. Dial-up IP looks like a standard BSD interface to the higher layers.
  221. The interface code is a substantially enhanced version of the SLIP driver
  222. written by Rick Adams and distributed with BSD 4.3. In addition to
  223. handling the SLIP protocol the driver now
  224. includes code to check on the status of the line
  225. (and request a phone call if the line is down), code to time out
  226. the line if it is idle, and extensive support for monitoring tools.
  227. .PP
  228. One complication in the interface is that a phone call may fail,
  229. leaving outbound datagrams sitting in the interface queue.
  230. We handle this problem by having the driver timeout
  231. the connection attempt if it takes too long and discard all queued
  232. datagrams. (Thankfully, IP permits datagrams to be discarded if they
  233. are undeliverable).
  234. .PP
  235. Another source of trouble comes from concurrent connection attempts (phone
  236. calls from both ends of the connection at the same time). This
  237. is handled by having the driver sleeping on a flag, and allowing
  238. it to be awakened either by a successful outgoing call, or a successful
  239. incoming call. The other call is then locked out, and will fail.
  240. .NH 2
  241. The Dial-up Pseudo-Device
  242. .PP
  243. The driver for the pseudo-device, \fI/dev/dial-up\fP, is new
  244. and comprises just a few lines of code.
  245. The one difficulty in writing the pseudo-device code
  246. was to avoid race conditions between the high-interrupt level
  247. interface driver and the application-level daemon. The record
  248. passed to the daemon contains address information and as well as part
  249. of the IP header. This gives \fIdiald\fP enough information to make selective
  250. decisions about when to dial the phone (see below).
  251. .NH 2
  252. Routing
  253. .PP
  254. Routing for dial-up IP is simple. The dial-up IP interface looks
  255. like a standard point-to-point link to the rest of the kernel.  Thus
  256. any datagram that can be sent over a point-to-point link can be
  257. sent over dial-up IP, including datagrams to networks that are
  258. on the other side of a dial-up link. Multiple dial-up IP links
  259. on a single host are feasible, although we recommend using
  260. dial-up IP only in a star topology; establishing multi-hop
  261. connections takes too long.
  262. .PP
  263. One small routing complication we encountered was that
  264. the BSD kernel checks to see if an interface is in the UP state
  265. before queuing datagrams on it. A dial-up link may not
  266. be up before it receives a datagram, so we had to fool the kernel
  267. into thinking that the interface was up, when in fact, no call
  268. was active. We solved this by simplying leaving the interface state
  269. hardwired as UP, and keeping track of whether we need to make a
  270. phone call with another flag maintained by the interface code.
  271. .NH 2
  272. Support for Multiple Platforms
  273. .PP
  274. The dial-up IP software package provides full IP support over
  275. dial up phone lines. It runs on Ultrix, Sun and BSD UNIX
  276. systems and
  277. requires a modem and a serial port on the computer.
  278. This software communicates with other computers that support
  279. dial-up IP or at least some version of SLIP. For example, dial-up IP
  280. works with Phil Karn's KA9Q SLIP package for IBM compatible PCs. We
  281. are currently investigating using it with Sun's dial-up PC-NFS package.
  282. .NH 1
  283. Support Applications
  284. .PP
  285. Dial-up IP requires some programs that run as user processes. These
  286. programs take care of call set up, interface configuration, monitoring
  287. and so on. These programs also make use of configuration files which specify
  288. phone numbers, devices, account names and connection-time restrictions.
  289. User level programs have also been developed for monitoring the
  290. dial-up IP link at both the IP and serial line level.
  291. Finally, utilities have been written for examining and changing timeouts and
  292. other interface parameters.
  293. .NH 2
  294. The Dialing Daemon
  295. .PP
  296. The key support program for providing transparency to the
  297. user is the dialing daemon, \fIdiald\fP,
  298. which dials the modem when dial-up interfaces need a connection established.
  299. .PP
  300. \fIDiald\fP is partially derived from the existing PhoneNet code that
  301. knows how to dial telephones. The dialing code reads a script that lists
  302. the commands necessary to establish a connection and log in. The
  303. command language for scripts is sufficiently diverse that \fIdiald\fP
  304. can establish a link not only over phone lines, but also through
  305. \fItelnet\fP, X.25 PAD and various switching devices such
  306. as port-selectors and even PC-Pursuit.
  307. .PP
  308. \fIDiald\fP also supports facilities that restrict access to the
  309. dial-up sites. Recall that the \fI/dev/dialup\fP device passes up
  310. some information from the IP header of the datagram that caused
  311. the request to bring up the link.  By checking this information with
  312. instructions in a configuration file, \fIdiald\fP
  313. can refuse to initiate calls based based on the source or destination IP
  314. address of the packet, the time of day, or higher level protocols
  315. (ICMP, UDP etc). These facilities allow the host
  316. to filter requests for bringing up the line and give administrators
  317. greater control over costs and access to their network.
  318. .PP
  319. When a dial-up interface must make a phone call, it places
  320. a request in the \fI/dev/dial-up\fP pseudo-device.
  321. When \fIdiald\fP reads this request, it matches the IP destination of the
  322. request with a specific remote host. The daemon then performs
  323. the security checks on the IP protocol number, the source and
  324. destination addresses,
  325. and the time of day. If the request is legitimate, \fIdiald\fP forks a
  326. child that runs the script to dial the phone number and perform the login
  327. sequence. At the remote (passive) end, a special shell is invoked that
  328. does further handshaking between the shell and the daemon child.
  329. Once the handshake is complete, both the child and the remote
  330. special shell do \fIioctl()\fPs to activate their dial-up interfaces.
  331. (The interfaces are brought up by switching the \fItty\fPs to
  332. a special line discipline.)
  333. The processes then sleep until the line is dropped. When
  334. the drivers time out the line, they send a SIGHUP to the controlling
  335. processes, at which time the processes clean up and exit.
  336. .PP
  337. Because the daemon-child and the special shell sleep instead of dying,
  338. the UNIX kernel believes that the \fItty\fP port is still in use.
  339. This prevents other \fIgetty\fPs from running on the passive end of the
  340. connection and prevents the line discipline from being reset on both ends. 
  341. .NH 2
  342. Manually Starting or Ending a Connection
  343. .PP
  344. In order to provide greater control to system administrators, we provide
  345. a utility called \fIupline\fP
  346. for manually establishing a connection to a
  347. particular dial-up site. The \fIupline\fP program can be run
  348. by hand or from shell scripts, and it takes a hostname or
  349. IP number as an argument. It operates much like the \fIdiald\fP
  350. daemon to establish a link.
  351. .PP
  352. In order to save phone charges, the dial-up IP driver will timeout inactive
  353. lines and terminate connections, which saves the user or administrator from
  354. dealing with disconnects. But if they wish, there is also a program,
  355. \fIdownline\fP, which allows administrators to take down a link manually.
  356. .NH 2
  357. Access Control
  358. .PP
  359. Currently, the only limits on the access and use of dial-up IP links
  360. are the checks done by \fIdiald\fP before establishing a connection.
  361. We are considering enhancing the dial-up IP access controls
  362. to filter out unwanted traffic while the link is up.  The justification
  363. for such filtering is both that sites may wish to protect themselves
  364. from unauthorized IP access from outside and, more importantly, that
  365. the dial-up links only be used by traffic that the site wants to pay for.
  366. .PP
  367. So far, the best algorithm appears to be to maintain a hash table of
  368. remote addresses.  Under this scheme, a remote IP address is 
  369. accredited by receiving a datagram from the dial-up IP site
  370. destined for the remote address.  Thus, whenever a datagram is
  371. received from the link, the outbound IP address is added to the hash table,
  372. and any time a datagram is presented to be sent out the link,
  373. the driver would first check to confirm that the source IP address
  374. was in the table.  Given that most links are only up for a brief period
  375. (usually much less than one hour) and the number of remote sites with
  376. which it exchanges data in one session is small, the hash table
  377. of accredited addresses should not need to be very large.
  378. .NH 1
  379. Services and Facilities
  380. .PP
  381. Dial-up IP provides a basic connection to \fIrelay.cs.net\fP but
  382. applications programs must be run
  383. to accomplish any real work. One problem is get these programs running
  384. (on remote systems) after a phone line is brought up. Since one of
  385. the main functions of dial-up IP in the CSNET community is to handle
  386. mail delivery, we have developed software that allows dial-up sites
  387. to request mail and other services from \fIrelay.cs.net\fP.
  388. (All Internet mail to the site can be directed to \fIrelay.cs.net\fP
  389. for queuing through judicious use of domain name system's MX resource
  390. records [#8].)
  391. .PP
  392. This software is based on a client-server model in which the client is
  393. able to ask the server to start mail delivery via the Simple Mail
  394. Transfer Protocol (SMTP) [#7] to a particular site, or
  395. to get usage data for a site, or to provide access to the BIND
  396. nameserver.  We believe a number of services remain which
  397. would be useful to dial-up IP users, and this client-server program
  398. provides a platform for these additional services.
  399. .PP
  400. Because dial-up IP is a pay-for-usage service, we provide tools for
  401. monitoring the usage at both the calling and the called end. Each
  402. call is logged, and the duration of the call is recorded so that
  403. administrators can monitor usage of the service. In addition,
  404. there are facilities for dynamic monitoring of the link at both
  405. the IP level and and at the serial line level.  A monitoring
  406. package is available that allows lines to be monitored locally or
  407. remotely, and can display statistics on the amount of traffic,
  408. utilization, number of characters, number of errors, and so on.
  409. There is also a tool for examining and dynamically modifying some of the
  410. dial-up parameters such as the timeout values and flags. 
  411. .NH 1
  412. Performance
  413. .PP
  414. When we started work on dial-up IP, we were concerned that its
  415. performance might not be satisfactory. In particular, we were concerned
  416. about the so-called ``slow-line problem.'' The slow-line problem
  417. affects communications over transmission lines whose speed is
  418. sufficiently low that the size of a datagram noticeably influences
  419. its transmission time. For example, IP datagrams typically vary
  420. in size from about 40 to 2048 bytes. On a 10Mbit (1.25Mbyte) Ethernet, any
  421. datagram in this size range can be transmitted in a fraction of a second.
  422. But on a 2400 bps telephone line, while a 40 byte datagram takes
  423. a sixth of a second, a 2048 byte datagram takes nearly 7 seconds.
  424. .PP
  425. The dramatic variation in transmission times can confuse TCP implementations.
  426. TCP uses an estimation of the network transmission times to decide
  427. when to retransmit a piece of data. On a slow link it is possible for
  428. a TCP implementation that has a low transmission estimate (based on
  429. transmission times of small datagrams) to send multiple, unnecessary
  430. retransmissions of large datagrams which clog up the link.
  431. In early 1988, most TCP implementations used time
  432. estimation algorithms that did not deal well with large variations,
  433. and informal reports suggested that in some scenarios, the slow-line
  434. problem caused 90% of the nominal bandwidth to be lost.
  435. As a result, we feared that the slow link problem would make dial-up IP
  436. uneconomical.
  437. .PP
  438. Thanks to the work of several researchers, primarily Van Jacobson and
  439. Phil Karn [#2,#3],
  440. TCP time estimation algorithms have improved dramatically in the past
  441. year.  By the time we tested our TCP implementation (which incorporated
  442. these new time estimation algorithms) over the dial-up IP links, we
  443. achieved throughput rates of over two-thirds of the line speed.
  444. .PP
  445. One unexpected problem with using dial-up IP is that
  446. it can take over one minute to make a phone call and establish a
  447. dial-up IP link. This presents a problem for many current
  448. implementations of TCP that use a timeout of only 30 seconds for
  449. the initial connection setup (the time they are willing to wait for
  450. an acknowledgement to the first SYN datagram sent out). We found that
  451. we had to increase the TCP connection timeout value to be 75 seconds
  452. for dial-up IP to work smoothly.   To ensure that all TCP implementations
  453. use equally high timeout values we have asked the Internet Engineering
  454. Task Force, which is in the process of developing a set of standards for
  455. hosts running TCP/IP, to require a longer TCP connection timeout.
  456. .NH 1
  457. Conclusion
  458. .PP
  459. We believe that dial-up IP is an excellent replacement for CSNET's
  460. PhoneNet service. In addition to cost savings, we have experienced fewer
  461. problems with PhoneNet sites using dial-up IP. Less overhead is required
  462. to support each site. There are fewer problems establishing the connection.
  463. TCP has proved better able to deal with transmission problems than PhoneNet.
  464. The biggest gain is that SMTP is more robust than the PhoneNet protocol so
  465. that there are fewer stuck messages which clog the mail queues. 
  466. .PP
  467. More generally, we believe this service is well suited for linking a number
  468. of remote stations or isolated LANs to each other, particularly for
  469. sites which require only infrequent IP access to computers at other sites.
  470. One limitation of dial-up IP is its long link setup time.  Because link
  471. setup currently takes a long time, TCP connections cannot currently
  472. establish a connection over a path that has multiple dial-up links.
  473. (Note that once a dial-up link has been established, dial-up links
  474. perform just as fast as dedicated lines).
  475. .SH
  476. References
  477. .IP [#2]
  478. V. Jacobson,
  479. ``Congestion Avoidance and Control,''
  480. \fIProc. ACM SIGCOMM '88\fP, pp. 314-329,
  481. Stanford, California, August 1988.
  482. .IP [#3]
  483. P. Karn and C. Partridge,
  484. ``Improving Round-Trip Time Estimates in Reliable Transport Protocols,''
  485. \fIProc. ACM SIGCOMM '87\fP, pp. 1-7,
  486. Stowe, Vermont, August 1987.
  487. .IP [#4]
  488. D.E. Comer and T. Narten,
  489. ``UNIX Systems as Cypress Implets,''
  490. \fIProc. 1988 Winter USENIX Conf.\fP,
  491. pp. 55-62, Dallas, TX, February 1988.
  492. .IP [#5]
  493. J. Romkey, \fIA Nonstandard for Transmission of IP Datagrams Over Serial
  494. Lines: Slip; RFC 1055\fP,
  495. Internet Working Group, Requests for Comments,
  496. No. 1055, DDN Network Information Center (NIC) at SRI International,
  497. Menlo Park, California, June 1988.
  498. .IP [#6]
  499. D.E. Comer and J.T. Korb,
  500. ``CSNET Protocol Software: The IP-to-X.25 Interface,''
  501. \fIProc. ACM SIGCOMM '83\fP, pp. 154-169,
  502. Austin, TX, March 1983.
  503. .IP [#7]
  504. J. Postel,
  505. \fISimple Mail Transfer Protocol; RFC 821\fP,
  506. Internet Working Group, Requests for Comments,
  507. No. 821, DDN Network Information Center (NIC) at SRI International,
  508. Menlo Park, California, August 1982.
  509. .IP [#8]
  510. C. Partridge,
  511. \fIMail Routing and the Domain System; RFC 974\fP,
  512. Internet Working Group, Requests for Comments,
  513. No. 974, DDN Network Information Center (NIC) at SRI International,
  514. Menlo Park, California, January 1986.
  515.